﻿using King.Box.OpenApi.Service.MessageHandlers;
using King.Box.Utils.Global;
using Newtonsoft.Json;
using Senparc.Weixin.MP;
using Senparc.Weixin.MP.Entities.Request;
using System;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace King.Box.OpenApi.Controllers
{
    public class WeiXinController : ApiController
    {
        /// <summary>
        /// 微信后台验证地址（使用Get），
        /// 微信后台的“接口配置信息”的Url填写如：http://weixin.senparc.com/weixin
        /// </summary>
        [HttpGet]
        public HttpResponseMessage Index([FromUri]PostModel postModel, string echostr)
        {
            if (postModel == null)
                return HttpResponseMessageExtend.ResponseMessageStringContent("param failed");

            //返回随机字符串则表示验证通过
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, GlobalConfig.WX_Token))
                return HttpResponseMessageExtend.ResponseMessageStringContent("failed");

            return HttpResponseMessageExtend.ResponseMessageStringContent(echostr);
        }

        /// <summary>
        /// 用户发送消息后，微信平台自动Post一个请求到这里，并等待响应XML。
        /// PS：此方法为简化方法，效果与OldPost一致。
        /// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包，使用WeixinResult，见MiniPost方法。
        /// </summary>
        [HttpPost]
        public HttpResponseMessage Index([FromUri]PostModel postModel)
        {
            try
            {
                if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, GlobalConfig.WX_Token))
                    return HttpResponseMessageExtend.ResponseMessageStringContent("failed");

                postModel.AppId = GlobalConfig.WX_AppId;//根据自己后台的设置保持一致
                postModel.Token = GlobalConfig.WX_Token;//根据自己后台的设置保持一致
                postModel.EncodingAESKey = GlobalConfig.WX_EncodingAESKey;//根据自己后台的设置保持一致

                //v4.2.2之后的版本，可以设置每个人上下文消息储存的最大数量，防止内存占用过多，如果该参数小于等于0，则不限制
                var maxRecordCount = 100;

                //自定义MessageHandler，对微信请求的详细判断操作都在这里面。
                var messageHandler = new CustomMessageHandler(Request.Content.ReadAsStreamAsync().Result, postModel, maxRecordCount)
                {
                    OmitRepeatedMessage = true
                };
                /* 如果需要添加消息去重功能，只需打开OmitRepeatedMessage功能，SDK会自动处理。
                 * 收到重复消息通常是因为微信服务器没有及时收到响应，会持续发送2-5条不等的相同内容的RequestMessage
                默认已经开启，此处仅作为演示，也可以设置为false在本次请求中停用此功能 */
                
                messageHandler.SaveRequestMessageLog();//记录 Request 日志（可选）

                messageHandler.Execute();//执行微信处理过程（关键）

                messageHandler.SaveResponseMessageLog();//记录 Response 日志（可选）

                return HttpResponseMessageExtend.ResponseMessageStringContent(messageHandler.TextResponseMessage);
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{ ex.Message },{ ex.StackTrace }");
                return HttpResponseMessageExtend.ResponseMessageStringContent(ex.Message);
            }
        }
    }
}
